package net.neosoftwareltda.neomobile;


import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;

import android.app.Activity;
import android.app.ProgressDialog;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;

public class Admin extends Activity {
	
	// array que contiene el encabezado extraido del archivo, para luego escribirlo en la BD
	String[] encab;
	String[] detalle;
	List<String> lista = new ArrayList<String>();
	List<String> listaNotas = new ArrayList<String>();
	//variables de BD
	BaseDatos BDSQLite = null;
	SQLiteDatabase db = null;
	
	TextView textoEstado;
	ProgressDialog cargandoDialog;
	
	@Override
	  public void onCreate(Bundle savedInstanceState) {
		 super.onCreate(savedInstanceState);
		 setContentView(R.layout.frmadmin);
		 
		 textoEstado = (TextView) findViewById(R.id.textView2);
	}
	
	public void loadFileButton(View v) {
		cargandoDialog = ProgressDialog.show(this, "Cargando archivo", "Por favor espere ...");
		textoEstado.setText("Cargando archivo ...");
		insertEncabezado();
		
		BDSQLite = new BaseDatos(this, "BDwork", null, 1);
        db = BDSQLite.getWritableDatabase();
		int id = getConsecutivoID("detalle");
		db.close();
		
		for (String valor : lista ){
			if (valor != null) {
				insertDetalle(valor.split(";"), id);
			}
			id++;
		}
		
		for (String valor2 : listaNotas) {
			if (valor2 != null){
				insertNotas(valor2.split(";"));
			}
		}
		
	}
	
	//metodo encargado de leer el archivo de importación
	private boolean loadFile(){
		boolean retorno = true;
		String resultadoFile = "";
		int i = 0;
    	
    	try {
    		InputStream inpStr = new FileInputStream(buscaNombreArchivo()); //openFileInput(buscaNombreArchivo());
    		
    		if (inpStr != null){
    			InputStreamReader inputStreamReader = new InputStreamReader(inpStr);
                BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
                String receiveString = "";
                StringBuilder stringBuilder = new StringBuilder();
                int contador = 0;
                int maxRegistros = 0;
                
                receiveString = bufferedReader.readLine();
                stringBuilder.append(receiveString);
                //inpStr.close();
                resultadoFile = stringBuilder.toString();
                encab = resultadoFile.split(";");
                maxRegistros = Integer.parseInt(encab[2]);
                
                resultadoFile = null;
                
                for (i= 1; i<= maxRegistros; i++)
                {
                	receiveString = bufferedReader.readLine();
                    stringBuilder.append(receiveString);
                    //inpStr.close();
                    
                    lista.add(receiveString);   
                }
                
                String primerNota = bufferedReader.readLine();
                while(primerNota != null){
                	
                	//receiveString = bufferedReader.readLine();
                    stringBuilder.append(primerNota);
                    //inpStr.close();
                    
                    listaNotas.add(primerNota);
                    
                    primerNota = bufferedReader.readLine();
                }
                //falta crear ciclo para llenar las listas del final del archivo
                //pendiente
               
                // se crea el encabezado para luego ser registrado en la BD
                                
                inpStr.close();
    		}
    	} catch (FileNotFoundException ex){
    		// En caso de no encontrar el archivo
    		retorno = false;
    		Log.e("Error File", "Error archivo NO encontrado - " + ex.toString() + " " +i);
    		Toast.makeText(this, "Error: Archivo no encontrado", Toast.LENGTH_LONG).show();
    	} catch (IOException e) {
			// En caso de no poder leer el archivo
    		retorno = false;
    		Log.e("Error File Read", "Error: Imposible leer el archivo - " + e.toString() + i);
    		Toast.makeText(this, "Error: Imposible leer el archivo", Toast.LENGTH_LONG).show();
		} finally {
			//finalmente borramos el archivo de entrada
			
			if (retorno) {
				File file = new File(buscaNombreArchivo());
		    	file.delete();
		    	
		    	textoEstado.setText("Archivo cargado correctamente");
				
			}
			cargandoDialog.dismiss();
	    	
		}
    	
    	
    	
    	return retorno;
		
	}
	
	private String buscaNombreArchivo() {
		String nombreArchivo = "";
		File[] folImp = new File(Environment.getExternalStorageDirectory() + "/NeoMobile/importar").listFiles();

		if (folImp!=null && folImp.length > 0){
			nombreArchivo = Environment.getExternalStorageDirectory() + "/NeoMobile/importar/" + folImp[0].getName();
		}
		
		return nombreArchivo;
	}

	// encargado de extraer el encabezado del .txt y realizar el insert en la BD
	private void insertEncabezado() {
		
		//obtener la hora actual
		Date date = new GregorianCalendar().getTime();
		//SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		String fechaActual = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date); //df.format(date);
		
		//conecta y abre la BD
        BDSQLite = new BaseDatos(this, "BDwork", null, 1);
        db = BDSQLite.getWritableDatabase();
        
        if (null != db) {
        	Toast.makeText(this, "Conectado OK", Toast.LENGTH_LONG).show();
        	//leemos el archivo de entrada, si la carga del archivo es exitosa, se procede a insertar el encabezado y el detalle respectivamente
        	if (loadFile()){
        		// Insert de la tabla encabezado
        		ContentValues values = new ContentValues();
        		values.put("id", getConsecutivoID("encabezado"));
        		values.put("grupo", encab[0]);
        		values.put("no_usuarios", encab[2]);
        		values.put("mes_facturacion", encab[3]);
        		values.put("nombre_empresa", encab[4]);
        		values.put("nombre_municipio", encab[7]);
        		values.put("fecha_registro", fechaActual);
        		db.insert("encabezado", null, values);
        		// FIN - Insert de la tabla encabezado
        		
        		//volcamos datos de la table detalle a la tabla detalle_bck
        		// se borran los datos de detalle_bck
        		db.execSQL("DELETE FROM detalle_bck");
        		// volcado de datos
        		db.execSQL("INSERT INTO detalle_bck select * from detalle");
        		// borrado de datos de la tabla detalle
        		db.execSQL("DELETE FROM detalle");
        		
        	}
        }
        db.close();
	}
	
	private void insertDetalle(String[] valores, int id) {
		//conecta y abre la BD
        BDSQLite = new BaseDatos(this, "BDwork", null, 1);
        db = BDSQLite.getWritableDatabase();
        
        if (null != db) {
        	//Toast.makeText(this, "Conectado OK", Toast.LENGTH_LONG).show();
        	//leemos el archivo de entrada, si la carga del archivo es exitosa, se procede a insertar el encabezado y el detalle respectivamente
        	
        		// Insert de la tabla encabezado
        		ContentValues values = new ContentValues();
        		values.put("id", id);
        		values.put("usuario", valores[0]);
        		values.put("direccion", valores[1]);
        		values.put("num_medi", valores[2]);
        		values.put("digitos_medidor", valores[3]);
        		values.put("ruta", valores[4]);
        		values.put("nivel", valores[5]);
        		values.put("terminal", valores[6]);
        		values.put("l_tomada", valores[7]);
        		values.put("l_anterior", valores[8]);
        		values.put("l_actufact", valores[9]);
        		values.put("fech_toma", valores[10]);
        		values.put("consumo", valores[11]);
        		values.put("nota", valores[12]);
        		values.put("lector", valores[13]);
        		values.put("critica", valores[14]);
        		values.put("promedio", valores[15]);
        		values.put("ciclo", valores[16]);
        		values.put("serviesp", valores[17]);
        		values.put("fecha_prog", valores[18]);
        		values.put("ult_consumo", valores[19]);
        		values.put("municipio", valores[20]);
        		values.put("factor", valores[21]);
        		values.put("nombre", valores[24]);
        		values.put("marca", valores[25]);
        		
        		db.insert("detalle", null, values);
        		// FIN - Insert de la tabla encabezado
        		
        	db.close();
        	
        }
	}
	
	private void insertNotas(String[] valores){
		
		//conecta y abre la BD
        BDSQLite = new BaseDatos(this, "BDwork", null, 1);
        db = BDSQLite.getWritableDatabase();
        
        if (null != db) {
        	ContentValues values = new ContentValues();
        	values.put("id", valores[0]);
        	values.put("valor", valores[1]);
        	
        	db.insert("notas", null, values);
        
        	db.close();
        }
        
	}
	
	//metodo encargado de consultar la determinada y obtener el ultimo ID para insertar el siguiente registro
	private int getConsecutivoID(String tabla){
		int valor = 0;
		
		//consultamos la tabla encabezado para obtener el ultimo ID
    	Cursor cur = db.rawQuery("select max(id) id from " + tabla, null);
    	if (cur.getCount() > 0 && encab != null){
    		cur.moveToNext();
    		valor = cur.getInt(0) + 1;
    		cur.close();
    	}
		
		return valor;
	}
	
	public void exportarFile(View v){
		String exportar = "";
		String hora = ""; 
		String fecha = "";
		Double consumoCalculado;
		//calculamos la fecha actual, para crear el archivo con este valor
		//obtener la hora actual
				Date date = new GregorianCalendar().getTime();
				//SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
				String fechaActual = new SimpleDateFormat("yyyy-MM-dd_HH_mm_ss").format(date); //df.format(date);
				//fechaActual.repl
		
		try {
			File outFile = new File(Environment.getExternalStorageDirectory() + "/NeoMobile/exportar/exportado_" + fechaActual + ".txt");
			FileWriter fileWriter;
			fileWriter = new FileWriter(outFile);
			BufferedWriter out = new BufferedWriter(fileWriter);
			
			BDSQLite = new BaseDatos(this, "BDwork", null, 1);
	        db = BDSQLite.getWritableDatabase();
			Cursor cur = db.rawQuery("SELECT id, usuario, l_tomada, l_anterior, digitos_medidor, factor, fech_toma, nota FROM detalle", null);
			
			if (cur.getCount() > 0) {
				while (cur.moveToNext()) {
				
					consumoCalculado = this.calcularConsumo(cur.getDouble(2), cur.getDouble(3), cur.getDouble(4), cur.getDouble(5));
					if (cur.getString(6).length() > 0){
						hora = cur.getString(6).substring(11, 19);
						fecha = cur.getString(6).substring(0, 10).replaceAll("-", "/");
					}
					
					
					exportar = cur.getString(1) + ";";
					exportar += cur.getString(2) + ";";
					exportar += fecha + ";";
					exportar += consumoCalculado + ";";
					exportar += cur.getString(7) + ";";
					exportar += hora + ";";
					out.write(exportar  + "\r\n");
					out.newLine();
					hora = "";
				}
				cur.close();
			}
			out.close();
			Toast.makeText(this, "Archivo "+ outFile.getName()+ " creado correctamente", Toast.LENGTH_LONG).show();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			Toast.makeText(this, "Error: Ocurrieron errores en la creación del archivo de exportación", Toast.LENGTH_LONG).show();
		}
       
    }
	
	
	private Double calcularConsumo(Double lecTomada, Double lecAnterior, Double digitos, Double factor) {
		Double n_consumo, n_base;
		
		if (factor == 0) {
			factor = (double) 1;
		}
		n_base = Math.pow(10, digitos);
		n_consumo = lecTomada - lecAnterior;
		
		if (n_consumo < 0 && lecAnterior != 0) {
			n_consumo = (n_base - lecAnterior) + lecTomada;
		}
		
		n_consumo = (double) Math.round(n_consumo * factor);
		
		return n_consumo;
	}
}
